iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Modern Web

Vue UI 探索:PrimeVue 學習之旅系列 第 29

[Day29] Form - Slider

  • 分享至 

  • xImage
  •  

回頭看下 Form 元件類內有個 Slider 的滾軸設定,根據拖曳滾軸的方式可方便變更輸入值。

基本使用如下,並搭配 InputText 輸入框雙向檢視輸入值。

import { ref } from 'vue'
const value = ref(null)
<InputText v-model.number="value" class="mb-6" />
<Slider v-model="value" class="w-56" />

image

step

加上 step 設定,表示每次拖曳時一次為 step 設定之值,便不會像一般使用上可以流線型的拖曳。
以下範例為每次拖動 25。

<InputText v-model.number="value" class="mb-6" />
<Slider v-model="value" :step="25" class="w-56" />

image

Filter

寫這篇的原因主要是看到這個範例,透過 Slider 拖曳的效果可以改變圖片的對比度(Contrast)、亮度(Brightness)及添加棕褐色系(Sepia)。
其中,對比度、亮度及添加棕褐色系的切換使用 SelectButton 元件,SelectButton 元件的使用說明可參考 SelectButton 一篇。

const imageRef = ref(null)
const imageSrc = ref(null)
const canvasImage = ref(null)

const filter = ref(0)
const filterValues = ref([100, 100, 0])
const filterOptions = ref([
  { label: '對比度', value: 0 },
  { label: '亮度', value: 1 },
  { label: '棕褐色系', value: 2 }
])
// 加上 css 樣式
const filterStyle = computed(() => {
  return {
    filter: `contrast(${filterValues.value[0]}%) brightness(${filterValues.value[1]}%) sepia(${filterValues.value[2]}%)`
  }
})
<div class="flex flex-col items-center">
    <img
      alt="user header"
      class="w-full md:w-80 rounded mb-6"
      src="https://images.unsplash.com/photo-1723984834599-5357b87f727c?q=80&w=1858&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"
      :style="filterStyle"
    />
    <SelectButton
      v-model="filter"
      :options="filterOptions"
      optionLabel="label"
      optionValue="value"
      class="mb-4"
    />
    <!-- 調整 Contrast、Brightness 及 Sepia -->
    <Slider v-model="filterValues[filter]" class="w-56" :min="0" :max="200" />
</div>

image

另外再寫一個簡單範例,結合資料上傳 FileUpload,上傳圖片後,搭配對比度(Contrast)、亮度(Brightness)及添加棕褐色系(Sepia)的調整,再下載修改完後的圖片。

// 上傳圖片
const onCustomUpload = ($event) => {
  const file = $event.files[0]
  imageSrc.value = window.URL.createObjectURL(file)
}

// 下載圖片
const downloadImg = async () => {
  const imgWidth = imageRef.value.clientWidth;
  const imgHeight = imageRef.value.clientHeight;

  // 動態設置 canvas 的寬高
  canvasImage.value.width = imgWidth;
  canvasImage.value.height = imgHeight;

  const ctx = canvasImage.value.getContext('2d')
  ctx.filter = filterStyle.value.filter
  ctx.drawImage(imageRef.value, 0, 0, imageRef.value.clientWidth, imageRef.value.clientHeight)
  const dt = canvasImage.value.toDataURL('image/jpeg')

  const link = document.createElement('a')
  link.href = dt
  link.download = 'downloadImg.jpg';
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}
<div class="flex flex-col items-center">
    <div class="mb-3">
      <div class="flex mb-3">
        <FileUpload
          name="demo[]"
          mode="basic"
          accept="image/*"
          @uploader="onCustomUpload($event)"
          :customUpload="true"
          :maxFileSize="1000000"
          :auto="true"
        />
        <Button label="下載圖片" severity="info" @click="downloadImg" class="ms-5" />
      </div>
      <img v-if="imageSrc" ref="imageRef" :src="imageSrc" alt="image" :style="filterStyle" />
      <canvas ref="canvasImage" class="hidden"></canvas>
    </div>
    <SelectButton
      v-model="filter"
      :options="filterOptions"
      optionLabel="label"
      optionValue="value"
      class="mb-4"
    />
    <Slider v-model="filterValues[filter]" class="w-56" :min="0" :max="200" />
</div>

上傳圖片調整對比度(Contrast)、亮度(Brightness)及添加棕褐色系(Sepia)
image

下載後:
image

參考連結:https://primevue.org/slider/


上一篇
[Day28] Media
下一篇
[Day30] Misc & 完賽心得~
系列文
Vue UI 探索:PrimeVue 學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言